/********************************************************************************
 *      Copyright:  (C) 2019 Wu Yujun<540726307@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  gsmd_tlv.h
 *    Description:  This head file 
 *
 *        Version:  1.0.0(2019年07月16日)
 *         Author:  Wu Yujun <540726307@qq.com>
 *      ChangeLog:  1, Release initial version on "2019年07月16日 15时37分46秒"
 *                 
 ********************************************************************************/
#ifndef _GSMD_TLV_H_
#define _GSMD_TLV_H_


#include <stdio.h>
#include <sys/select.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "gsmd.h"
#include "crc-itu-t.h"

#define PACK_HEADER        0xFD
/*    TLV packet fixed segement size, 1B Head, 1B Tag, 1B length, 2B CRC16, total 5B. */
#define TLV_FIXED_SIZE     5

/*    TLV packet Minimum size is fixed bytes + 1 byte data */
#define TLV_MIN_SIZE       (TLV_FIXED_SIZE+1)

#define TLV_MAX_SIZE       32


/*    Tag definition */
enum
{
    TAG_LOGON=1,
    TAG_PPP,
    TAG_SMS,
    TAG_SIGNAL,
    TAG_ANS
};


#define         BACK_LOG        13
#define         MAX_EV          256

#define         BUFSIZE         256

#define         LOGON_OK        1
#define         LOGON_ERROR     -1

#define         ON              1
#define         OFF             0

#define         SUCCE           1 
#define         FAIL            0



/* ***************************************************************
 *  描述：登录报文的装包
 *
 *  参数：buf用于返回的登录报文，size为buf的大小，pwd命令是登录的密码字符串
 * 
 *  返回值：
 *        失败返回0，成功返回报文大小
 *
 ************************************************************************/
int packtlv_logon(char *buf, int size, char *pwd);


/******************************
 * 描述：封装PPP拨号上网报文
 *  
 * 参数：
 *      cmd可以是ON,PPP拨号连接，或者是OFF断开PPP拨号连接
 *
 * 返回值：
 *      失败返回0，,成功返回ppp报文大小
 **********************************************************/
int packtlv_ppp(char *buf, int size, int cmd) ;


/************************************************************
 * 描述：封装SMS发短信报文
 * 
 * 参数：
 *       tel_num是要给哪个号码短信以字符串的形式，mess发短信的内容
 * 
 * 返回值：
 *       失败返回0，,成功返回SMS报文大小
 ***********************************************************/
int packtlv_sms(char *buf, int size, char *tel_num, char *mess) ;


/* *******************************************
 * 描述：tlv报文解包
 *  
 * 参数：
 *      true_tlv用于返回正确的tlv报文，int *ture_size返回正确的tlv报文大小
 *     
 * 返回值：
 *      如果tlv报文处理完了返回0 ，如果有半帧的情况返回半帧tlv报文大小
 *      
 *********************************************/
int  unpack_tlv(char *buf, int bytes, char *true_tlv,int *true_size) ;


/* *************************************** *
 * 描述：以16进制形式打印tlv报文
 * 
 *******************************************/
void print_tlv(char* type,char *buf, int len) ;


/*******************************************************
 *  描述：检查登录密码
 *  
 *  返回值:
 *        密码正确返回LOGON_OK，密码错误返回LOGON_ERROR
 *  
 ********************************************************/
int tlv_logon(char *buf,int size) ;

/* ********************************************
 *  描述：登录答复，三秒内需要发送登录报文
 * 
 *  返回值：
 *        成功返回0， 失败返回负数
 *    
 *******************************************/
int logon_rev(int cli_fd, char *buf, int size) ;


/****************************************************
 *  描述：tlv报文解析操作,根据tlv报文PPP拨号或发短信
 *  
 **************************************************/
int tlv_gprs(int cli_fd ,char *buf,int size, st_gsmd_ctx *gsmd_ctx) ;

int packtlv_signal(char *buf, int size, int signal) ;



#endif
